import pymysql
from PyQt6.QtSql import QSqlDatabase, QSqlQuery
from test1.student_system.config.settings import DB_HOST,DB_PORT,DB_USER,DB_PASSWORD,DB_NAME,DB_CHARSET
class DatabaseManager():
    def __init__(self):
        self.connection= None
    def __enter__(self): # 进入with语句时,会创建连接,这时python对象的特性,要学习,相关的特性还有
        #__new__ 方法创建对象时调用
        #__enter__ 方法进入with语句时调用
        #__exit__ 方法退出with语句时调用
        #__del__ 方法对象销毁时调用
        #__call__ 方法对象调用时调用
        #__getitem__ 方法获取对象属性时调用
        #__setitem__ 方法设置对象属性时调用
        #__delitem__ 方法删除对象属性时调用
        #__contains__ 方法判断对象属性是否存在时调用
        #__iter__ 方法获取对象迭代器时调用
        #__reversed__ 方法获取对象迭代器时调用
        #__str__ 方法获取对象字符串时调用
        #__repr__ 方法获取对象 repr 时调用
        #__hash__ 方法获取对象哈希值时调用
        #__bool__ 方法获取对象布尔值时调用
        #__format__ 方法格式化对象时调用
        #__lt__ 方法比较对象小于时调用
        #__le__ 方法比较对象小于等于时调用
        #__gt__ 方法比较对象大于时调用
        #__ge__ 方法比较对象大于等于时调用
        #__getattr__ 方法获取对象属性时调用
        #__setattr__ 方法设置对象属性时调用
        #__delattr__ 方法删除对象属性时调用
        #__getattribute__ 方法获取对象属性时调用

        #print("调用enter")
        self.connection = self.create_connection()
        return self
    def __exit__(self, exc_type, exc_val, exc_tb):
        #print("调用exit")#退出with语句时,会调用exit,会关闭连接
        if self.connection:
            self.connection.close()
    #连接数据库的方法
    def create_connection(self):
        if self.connection is None or not self.connection.open:
            try :
                self.connection=pymysql.connect(
                    host=DB_HOST,
                    port=DB_PORT,
                    charset=DB_CHARSET,
                    user=DB_USER,
                    password=DB_PASSWORD,
                    database=DB_NAME,
                    cursorclass=pymysql.cursors.DictCursor #以字典形式展示查到的数据
                )
                #print(self.connection)
            except Exception as e:
                print(f"数据库连接失败:{e}")
        return self.connection
    #查询的方法
    def fetch_query(self,query,params= None,single=False):
        #single=False #默认多条查询,如果是一条,它也是以字典的形式展示[{}]
        result=None
        if self.connection:
            try:
                with self.connection.cursor() as cursor:#获取游标对象
                    cursor.execute(query)
                    if single:
                        result=cursor.fetchone()#这是查询单条的方式
                    else:
                        result=cursor.fetchall()#这是查询多条的方式
                    # if params:
                    #     cursor.execute(query,params)
                    # else:
                    #     cursor.execute(query)

            except Exception as e:
                print(f"查询错误:{e}")
        return result
    #执行的方法
    def execute_query(self,query,params=None):
        if self.connection:
            try:
                with self.connection.cursor() as cursor:
                    if params:
                        cursor.execute(query,params)
                    else:
                        cursor.execute(query)
                    self.connection.commit()
            except Exception as e:
                print(f"执行错误:{e}")
                self.connection.rollback()
                return None
        else:
            print("数据库未连接")
    #关闭数据库的方法
    def close_connection(self):
        if self.connection and self.connection.open:
            self.connection.close()
            print("数据库已关闭")
if __name__ == '__main__':
    with DatabaseManager() as db:
        pass
        ## 查询所有学生信息
        #query = "SELECT * FROM students"
        #students = db.fetch_query(query)
        #print(students)
#
        ## 添加学生信息
        #query = "INSERT INTO students (name, age) VALUES (%s, %s)"
        #params = ("张三", 18)
        #db.execute_query(query, params)
#
        ## 更新学生信息
        #query = "UPDATE students SET age = %s WHERE name = %s"












